package com.psiqueware.alheli.seguridad.dao;
/**
 * @author <a href = "mailto:AngelElectrico@PsiqueWare.com">Angel El&eacute;ctrico</a>
 *         Creaci&oacute;n: 27-oct-2005 - 12:29:11
 *         Cambios :
 *         Autor  |  Cambios
 */

import com.psiqueware.alheli.dao.*;
import com.psiqueware.alheli.seguridad.Agrupacion;
import com.psiqueware.alheli.seguridad.Credencial;
import com.psiqueware.alheli.seguridad.UsuarioSeguridad;

import java.util.List;

/**
 * Definici&oacute;n gen&eacute;rica para operaciones CRUD para el objeto {@link Credencial}
 * Date: 24-oct-2005
 * Time: 17:58:41
 *
 * @author <a href="mailto:psiquetp@gmail.com">Psique</a>
 */
public interface CredencialDAO extends BaseDAO
{

    /**
     * Guarda un {@link Credencial} en persistencia.
     * Este {@link Credencial} no exist&iacute;a previamente en persistencia.
     *
     * @param credencial
     * @param enlaceTransaccional enlace para hacer at&oacute;micas las transacciones.
     *
     * @return CredencialK despu&eacute;s de persistirse.
     *
     * @throws AlreadyPersistedObjectException en caso de que este {@link Credencial} ya existiera en persistencia.
     */
    public Credencial saveCredencial(Credencial credencial, final EnlaceTransaccional enlaceTransaccional) throws AlreadyPersistedObjectException, DAOException;

    /**
     * Actualiza un {@link Credencial} en persistencia
     *
     * @param credencial          a actualizar
     * @param enlaceTransaccional enlace para hacer at&oacute;micas las transacciones.
     *
     * @return {@link Credencial} actualizado
     *
     * @throws NotAPersistedObjectException en caso de que este {@link Credencial} no existiera en persistencia.
     */
    public Credencial updateCredencial(Credencial credencial, final EnlaceTransaccional enlaceTransaccional) throws NotAPersistedObjectException, DAOException;

    /**
     * Devuelve un {@link Credencial} a partir de su id.
     *
     * @param id                  del {@link Credencial} que se busca
     * @param enlaceTransaccional enlace para hacer at&oacute;micas las transacciones.
     *
     * @return {@link Credencial} en caso de encontrarlo, <code>null</code> en otro caso.
     *
     * @throws DAOException si se presenta alg&uacute;n problema.
     */
    public Credencial findCredencialPorId(Long id, final EnlaceTransaccional enlaceTransaccional) throws DAOException;

    /**
     * Devuelve una {@link Credencial} a partir del id de su {@link UsuarioSeguridad}.
     *
     * @param usuarioSeguridad    cuya CredencialK se busca
     * @param enlaceTransaccional enlace para hacer at&oacute;micas las transacciones.
     *
     * @return {@link Credencial} en caso de encontrarla, <code>null</code> en otro caso.
     *
     * @throws DAOException si se presenta alg&uacute;n problema.
     * @noinspection InstanceMethodNamingConvention
     */
    public Credencial findCredencialUsuarioSeguridad(UsuarioSeguridad usuarioSeguridad, final EnlaceTransaccional enlaceTransaccional) throws DAOException;

    /**
     * Elimina un {@link Credencial} del sistema de persistencia.
     *
     * @param credencial          que se pretende elimninar.
     * @param enlaceTransaccional enlace para hacer at&oacute;micas las transacciones.
     *
     * @throws NotAPersistedObjectException si dicho objeto no exist&iacute;a en persistencia.
     */
    public void deleteCredencial(com.psiqueware.alheli.seguridad.Credencial credencial, final EnlaceTransaccional enlaceTransaccional) throws NotAPersistedObjectException, DAOException;

    /**
     * Devuelve un listado de los {@link Credencial} que se encuentran en persistencia.
     *
     * @param enlaceTransaccional enlace para hacer at&oacute;micas las transacciones.
     *
     * @return List de objetos {@link Credencial}, sin objetos en caso de no haberlos.
     *
     * @throws DAOException si se presenta alg&uacute;n problema.
     */
    public List listCredencial(EnlaceTransaccional enlaceTransaccional) throws DAOException;

    /**
     * Devuelve un listado de los {@link Credencial}es para una {@link Agrupacion}.
     *
     * @param enlaceTransaccional enlace para hacer at&oacute;micas las transacciones.
     *
     * @return List de objetos {@link Credencial}, sin objetos en caso de no haberlos.
     *
     * @throws DAOException si se presenta alg&uacute;n problema.
     */
    List<Credencial> listCredencialPorAgrupacion(final Agrupacion agrupacion, final EnlaceTransaccional enlaceTransaccional) throws DAOException;
}
